import xlrd
import xlwt
import openpyxl
import os

DIRPATH = os.path.dirname(os.path.realpath(__file__))
path = r".\t2.xlsx"
rpath2 = ""
rpath3 = ""
readExcel = xlrd.open_workbook(path)  # 读取EXCEL
writeExcel = xlwt.Workbook()  # 写入EXCEL  原本有这个操作的，但是后面没用
loadExcel = openpyxl.load_workbook(path)  # 打开给定的文件名并返回工作簿，这里主要用来获取表列数   其实这里感觉是重复了
sheet = readExcel.sheets()[0]  # 0表示读取第一个工作表sheet
# 创建一些空数组
data = []
oneDirNum = []
oneDirName = []
twoDirNum = []
twoDirName = []

sheetName = loadExcel['Sheet1']  # 指定工作表名称，这个是为获取表格列数准备的
colNum = sheetName.max_column  # 获取表格列数，确认目录分级数
rowNum = sheetName.max_row  # 获取表格行数，确认目录分级数
for i in range(0, sheet.nrows):  # nrows表示按行读取，ncols表示按列读取
    ## 这里有一个问题：Python读取excel的整数时，会自动把它转化为float格式，查了下有一些办法来解决它，比如：https://www.cnblogs.com/guolizhi/p/8310204.html ，但是除了在代码中声明进行数据转换外，还有一个比较原始的办法，也是我使用的办法：直接在Excel中数字前面添加英文的单引号，以文本的形式存储数字，这里需要注意的是，直接将单元格设置为文本格式是不行的，貌似只有直接添加英文单引号，具体什么原因还没研究
    data.append(sheet.row_values(i))  # row_values(i)表示按照一行中的所有单元格遍历读取，col_values(i)表示按照一列中的所有单元格遍历读取
    oneDirNum.append(data[i][0])  # 存储一级目录编号
    oneDirName.append(data[i][1])  # 存储一级目录名称

    rPath = os.path.join(DIRPATH, data[i][1])  # 设置一级目录创建位置  这里直接就在工程目录创建了，没有更改
    os.mkdir(rPath)  # 创建一级目录

    twoDirNum.append(data[i][2])  # 存储二级目录编号
    twoDirName.append(data[i][3])  # 存储二级目录名称

for j in range(
        rowNum):  # 这里是不严谨的，因为这里是默认一二三各级目录总数是相等的情况下进行循环的，但是rowNum是整个表单最大行数，如果三级目录总数大于二级目录，那么这里就会存在list index out of range的情况
    twoNum = data[j][2]
    m = twoNum.split("-")[0]

    threeNum = data[j][4]
    mm = threeNum.split("#")[0]

    if m in oneDirNum:
        # print(oneDirName[int(m) - 1])
        rpath2 = os.path.join(DIRPATH, oneDirName[int(m) - 1], data[j][3])  # 设置二级目录创建位置 这里有一个小细节：因为一级目录的编号是连续的数字且没有任何多余的符号，所以data[j][9]可以直接锁定到位置，另外，int(m)是因为m此时是以一个string类型的数据在参与运算，不转化一下是会报类型错误的
        os.mkdir(rpath2)  # 创建二级目录
        print("二级目录：", rpath2)

        # 难点来了！  三级目录的创建
        # 我原本的想法是通过二级目录匹配一级目录的办法来实现三级目录匹配二级目录，但是在二级目录编号中由于存在了符号，且编号前缀存在多个对应的情况，所以无法直接匹配
        # 有一说一，我搞不转了
        # 下面是我写的一点东西，但是这都是错的，里面有一个逻辑错误，无法正确的创建三级目录

        # 第一次我是这样写的：但是由于一级目录下含有多个二级目录，一个二级目录下又可能存在多个三级目录，所以目录的归类随着循环的增加，j的变化，导致三级目录归类是错误的，他只能归类到Excel表中同一行的目录下
        # if mm in twoDirNum:
        #     rpath3 = os.path.join(rpath2, data[int(j)][5])
        #     os.mkdir(rpath3)
        #     print("三级目录：", rpath3)

        # 第二次我是这样写的：我增加了一个判断，用来判断当前三级目录编号前缀对应的二级目录编号是不是与上一个三级目录编号前缀相同，如果相同，那么说明这个三级目录创建位置还可以不用变动，如果不一样，那就用上一个二级目录
        # 但是！！！这里匹配到的二级目录名称只是Excel中对应三级目录的前一行里面的二级目录，如果多两个三级目录，那么这里的匹配到的三级目录对应的二级目录就全部乱套了
        if mm == data[j - 1][4].split("#")[0]:
            rpath2 = os.path.join(DIRPATH, oneDirName[int(m) - 1], data[j][3])
            rpath3 = os.path.join(rpath2, data[int(j)][5])
            os.mkdir(rpath3)
        else:
            rpath2 = os.path.join(DIRPATH, oneDirName[int(m) - 1], data[j - 1][3])
            # print(twoDirName[int(mm) - 1])
            rpath3 = os.path.join(rpath2, data[int(j)][5])
            os.mkdir(rpath3)
            # print(mm)
            print("三级目录：", rpath3)

        # 我不会了，玩不转
